前端培训 您所在的位置:网站首页 vue show if 前端培训

前端培训

2023-07-08 19:26| 来源: 网络整理| 查看: 265

v-if 是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

v-show不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

性能消耗

v-if 有更高的切换消耗。

v-show 有更高的初始渲染消耗。

应用场景

基于以上区别,我们可以得出结论:元素进入页面后显示或者隐藏状态不会被修改,建议使用v-if。元素需要非常频繁地切换,则使用 v-show 较好。

三、原理分析

下面我们通过Vue2的源码,来看看v-if和v-show的原理。

1. v-if原理

在模板编译的parse阶段,会使用 processIfConditions 函数处理条件渲染指令的内容:

function genElement (el, state) {

if (el.if && !el.ifProcessed) {

return genIf(el, state)

} else {

let code

if (el.component) {

code = genComponent(el.component, el, state)

} else {

const data = el.plain ? undefined : genData(el, state)

const children = el.inlineTemplate ? null : genChildren(el, state, true)

code = `_c('${el.tag}'${

data ? `,${data}` : '' // data

}${

children ? `,${children}` : '' // children

})`

}

return code

}

}

function genIf (

el,

state,

altGen,

altEmpty

) {

el.ifProcessed = true;

return genIfConditions(el.ifConditions.slice(), state, altGen, altEmpty)

}

function genIfConditions (

conditions,

state,

altGen,

altEmpty

) {

if (!conditions.length) {

return altEmpty || '_e()'

}

var condition = conditions.shift();

if (condition.exp) {

return ("(" + (condition.exp) + ")?" + (genTernaryExp(condition.block)) + ":" + (genIfConditions(conditions, state, altGen, altEmpty)))

} else {

return ("" + (genTernaryExp(condition.block)))

}

function genTernaryExp (el) {

return altGen

? altGen(el, state)

: el.once

? genOnce(el, state)

: genElement(el, state)

}

}

从代码可以看出,v-if指令特性是一个三元表达式。带有v-if指令的模版会进行判断,如果值为true,则会生成dom树。值为false,会生成一个注释节点占位。

2. v-show原理

v-show 的本质是 Vue 中内置的一个自定义指令,借助于 v-show 我们可以控制目标节点 style 中的 display 属性值。

我们看一下v-show 内置自定义指令源码。

bind (el: any, { value }: VNodeDirective, vnode: VNodeWithData) {

vnode = locateNode(vnode)

const transition = vnode.data && vnode.data.transition

const originalDisplay = el.__vOriginalDisplay =

el.style.display === 'none' ? '' : el.style.display

if (value && transition) {

vnode.data.show = true

enter(vnode, () => {

el.style.display = originalDisplay

})

} else {

el.style.display = value ? originalDisplay : 'none'

}

},

update (el: any, { value, oldValue }: VNodeDirective, vnode: VNodeWithData) {

if (value === oldValue) return

vnode = locateNode(vnode)

const transition = vnode.data && vnode.data.transition

if (transition) {

vnode.data.show = true

if (value) {

enter(vnode, () => {

el.style.display = el.__vOriginalDisplay

})

} else {

leave(vnode, () => {

el.style.display = 'none'

})

}

} else {

el.style.display = value ? el.__vOriginalDisplay : 'none'

}

},

unbind (

el: any,

binding: VNodeDirective,

vnode: VNodeWithData,

oldVnode: VNodeWithData,

isDestroy: boolean

) {

if (!isDestroy) {

el.style.display = el.__vOriginalDisplay

}

}

通过上述代码可以得知,v-show 指令核心代码就是:el.style.display = value ? el.__vOriginalDisplay : 'none'。通过控制元素的display属性来实现元素的显示隐藏。返回搜狐,查看更多



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有